﻿using System;
using System.Collections.Generic;
using MathNet.Numerics.LinearAlgebra;

namespace cit.CopyDetection.Model
{
    /// <summary>
    /// Các phép toán mở rộng cho ma trận
    /// </summary>
    public static class MatrixExtension
    {
        /// <summary>
        /// Cắt lấy k dòng đầu tiên của ma trận m
        /// </summary>
        /// <param name="m">Ma trận m</param>
        /// <param name="k">k dòng đầu tiên cần lấy</param>
        /// <returns>Ma trận có k dòng đầu tiên của m</returns>
        public static Matrix TruncateRows(this Matrix m, int k) 
        {
            int rows = m.RowCount;
            int columns = m.ColumnCount;

            if (k >= rows) return m;
            return m.GetMatrix(0, k - 1, 0, columns - 1);
        }

        /// <summary>
        /// Cắt lấy k cột đầu tiên của ma trận m
        /// </summary>
        /// <param name="m">Ma trận m</param>
        /// <param name="k">k cột đầu tiên cần lấy</param>
        /// <returns>Ma trận có k cột đầu tiên của m</returns>
        public static Matrix TruncateColumns(this Matrix m, int k)
        {
            int rows = m.RowCount;
            int columns = m.ColumnCount;

            if (k >= columns) return m;
            return m.GetMatrix(0, rows - 1, 0, k - 1);
        }

        /// <summary>
        /// Cắt lấy k dòng-cột đầu tiên của ma trận m
        /// </summary>
        /// <param name="m">Ma trận m</param>
        /// <param name="k">k dòng-cột đầu tiên cần lấy</param>
        /// <returns>Ma trận có k dòng-cột đầu tiên của m</returns>
        public static Matrix Truncate(this Matrix m, int k)
        {
            return m.TruncateRows(k).TruncateColumns(k);
        }

        /// <summary>
        /// Tạo ma trận từ tập các vector đoạn văn bản
        /// </summary>
        /// <param name="paraModels">Tập các vector đoạn văn bản</param>
        /// <returns>Ma trận các đoạn văn bản</returns>
        public static Matrix CreateMatrix(IList<ParagraphModel> paraModels)
        {
            IList<Vector> vectors = new List<Vector>();
            foreach (ParagraphModel paraModel in paraModels)
            {
                vectors.Add(paraModel.Vector);
            }

            return Matrix.CreateFromColumns(vectors);
        }
    }
}
